package ve.gob.ine.censo.beans;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import org.primefaces.model.DualListModel;

import ve.gob.ine.censo.manager.UsuarioManager;
import ve.gob.ine.censo.model.sis_reportes.Grupo;
import ve.gob.ine.censo.model.sis_reportes.Rol;
import ve.gob.ine.censo.model.sis_reportes.Usuario;
import ve.gob.ine.censo.model.sis_reportes.UsuarioExample;

@ManagedBean(name="administracionUsuarioBean")
@SessionScoped
public class AdministracionUsuarioBean  {

	/**
	 * 
	 */
	private static final long serialVersionUID = -2185591788132563560L;
	
	public Usuario usuarioInicial;
	
//	protected UsuarioDAO usuarioDAO;
	
	private UsuarioManager usuarioManager;
	
//	private UsuarioRolDAO usuarioRolDAO;
//	
//	private UsuarioGrupoDAO usuarioGrupoDAO;
	
	private Usuario usuario;
	
	private List<Rol> usuarioRoles;
	
	private List<Grupo> usuarioGrupos;
	
//	private UsuarioUserDAO usuarioUserDAO;
	
	public AdministracionUsuarioBean() {
		super();
		this.usuarioManager = new UsuarioManager();
//		this.usuarioDAO = new UsuarioDAOImpl(Conexion.config());
//		this.usuarioRolDAO = new UsuarioRolDAOImpl(Conexion.config());
//		this.usuarioGrupoDAO = new UsuarioGrupoDAOImpl(Conexion.config());
//		this.usuarioUserDAO = new UsuarioUserDAOImpl(Conexion.config());
		this.usuarioRoles = new ArrayList<Rol>();
	}
	
	public Usuario getUsuarioInicial() {
		return usuarioInicial;
	}

	public void setUsuarioInicial(Usuario usuarioInicial) {
		this.usuarioInicial = usuarioInicial;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuarioEliminar(Usuario usuario) {
		this.usuario = usuario;
	}

	public DualListModel<Rol> getUsuarioRoles() {
		
		if(this.usuario!=null)
			System.out.println("getUsuarioRoles::UsuarioID:"+usuario.getId());
		
		List<Rol> source = new ArrayList<Rol>();
		List<Rol> target = new ArrayList<Rol>();
//		try {
////			source = usuarioUserDAO.selectNotInRolesByUsuarioId(usuario);
////			target = usuarioUserDAO.selectRolesByUsuarioId(usuario);
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
		return new DualListModel<Rol>(source, target);
	}

	public void setUsuarioGrupos(DualListModel<Grupo> usuarioGrupos) {
		this.usuarioGrupos = usuarioGrupos.getTarget();
	}

	public DualListModel<Grupo> getUsuarioGrupos() {
		List<Grupo> source = new ArrayList<Grupo>();
		List<Grupo> target = new ArrayList<Grupo>();
//		try {
////			source = usuarioUserDAO.selectNotInGruposByUsuarioId(usuario);
////			target = usuarioUserDAO.selectGruposByUsuarioId(usuario);
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
		return new DualListModel<Grupo>(source, target);
	}

	public void setUsuarioRoles(DualListModel<Rol> usuarioRoles) {
		this.usuarioRoles = usuarioRoles.getTarget();
	}
	
	
	public void setUsuario(Usuario usuario) {
		this.usuarioInicial = usuario;
		this.usuario = usuario;
		
		if(usuario!=null)
			System.out.println("setUsuario:::UsuarioID:"+usuario.getId());
		
//		if(this.usuario!=null && this.criteriaDrillDown!=null){
//			this.criteriaDrillDown = criteriaDrillDownConvert(usuario, this.criteriaDrillDown);
//			this.criteriaDrillDown.trim();
//
//			criteriaDrillDown.setNacionalId(usuario.getCodNac());
//			if(usuario.getCodNac()!=null) cambio_cbo_nacional(null);
//			
//			criteriaDrillDown.setEntidadId(usuario.getCodEnt());
//			if(usuario.getCodEnt()!=null) cambio_cbo_entidad(null);
//			
//			criteriaDrillDown.setMunicipioId(usuario.getCodMun());
//			if(usuario.getCodMun()!=null) cambio_cbo_municipio(null);
//			
//			criteriaDrillDown.setParroquiaId(usuario.getCodParrq());
//			if(usuario.getCodParrq()!=null) cambio_cbo_parroquia(null);
//			
//			criteriaDrillDown.setCentroRecoleccionId(usuario.getIdCtocensal());
//			if(usuario.getIdCtocensal()!=null) cambio_cbo_centroRecoleccion(null);
//			
//			criteriaDrillDown.setSupervisorCampoId(usuario.getIdsupervisor());
//			if(usuario.getIdsupervisor()!=null) cambio_cbo_supervisor(null);
//			
//			criteriaDrillDown.setEmpadronadorId(usuario.getIdempadronador());
//			if(usuario.getIdempadronador()!=null) cambio_cbo_empadronador(null);
//		}
	}
	
	
	public String crearUsuario() { 
		Usuario usuario = new Usuario();
		usuario.setId(-1);
//		usuario.setEsusuarioindicador("SI");
		this.setUsuario(usuario);
		return "cargarUsuario";
	}	
	
	public String cargarUsuario() { 
		
//		if("SI".equalsIgnoreCase(this.usuario.getEsusuarioindicador())){
			Encriptacion esource = new Encriptacion();
			String key = "DC101AB52CF894CEE52F61731643B94F";
			byte[] keyb = FunctionByte.hex2byte(key);
			String password = esource.Decrypt(keyb, FunctionByte.hex2byte(this.usuario.getClave()));
			this.usuario.setClave(password);
			return "cargarUsuario";	
//		}
//		return "cargarUsuarioMigrado";
	}

	public String eliminarUsuario() { 
//		try {
//			UsuarioExample example = new UsuarioExample();
//			example.createCriteria().andIdEqualTo(this.usuario.getId());
////			this.usuarioDAO.deleteByExample(example);
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
		return "consultaPersonal";
	}	

	public String consultaUsuario() {
		return "consultaPersonal";
	}
	
	public String actualizarNivelAccesoUsuario() throws SQLException {
//		this.usuario = nivelAccesoUsuarioConvert(this.usuario, this.criteriaDrillDown);
//		
//		if("SI".equalsIgnoreCase(this.usuario.getEsusuarioindicador())){
			Encriptacion esource = new Encriptacion();
			String key = "DC101AB52CF894CEE52F61731643B94F";
			byte[] keyb = FunctionByte.hex2byte(key);
			String password = FunctionByte.toHEX1(esource.Encrypt(keyb, this.usuario.getClave()));
			this.usuario.setClave(password);
//		}
		
		if(this.usuario.getId()!=null && !this.usuario.getId().equals(-1)){
			System.out.println("actualizarNivelAccesoUsuario::update");
			UsuarioExample example = new UsuarioExample();
			example.createCriteria().andIdEqualTo(this.usuario.getId());
//			this.usuarioDAO.updateByExample(this.usuario, example);			
		}else{
			System.out.println("actualizarNivelAccesoUsuario::insert");
			this.usuario.setId(this.usuarioManager.saveUsuario(this.usuario));
		}
		
//		if(this.usuario.getId()!= null){
//
//			UsuarioRolExample exampleRol = new UsuarioRolExample();
//			exampleRol.createCriteria().andIdusuarioEqualTo(this.usuario.getId());
////			this.usuarioRolDAO.deleteByExample(exampleRol);
//			
//			for (Rol rol : this.usuarioRoles) {
//				UsuarioRol usuarioRol = new UsuarioRol();
//				usuarioRol.setIdusuario(this.usuario.getId());
//				usuarioRol.setIdrol(rol.getId());
////				this.usuarioRolDAO.insert(usuarioRol);
//			}
//
//			UsuarioGrupoExample exampleGrupo = new UsuarioGrupoExample();
//			exampleGrupo.createCriteria().andIdusuarioEqualTo(this.usuario.getId());
////			this.usuarioGrupoDAO.deleteByExample(exampleGrupo);
//			
//			for (Grupo grupo : this.usuarioGrupos) {
//				UsuarioGrupo usuarioGrupo = new UsuarioGrupo();
//				usuarioGrupo.setIdusuario(this.usuario.getId());
//				usuarioGrupo.setIdgrupo(grupo.getId());
////				this.usuarioGrupoDAO.insert(usuarioGrupo);
//			}
//			
//		}
		
		return "listaUsuarios";
	}
}